#/bin/bash
###############################################################################
# SNMPGrab frontend                                                           #
# Criado por Augusto G. Andreollo (guto.andreollo@gmail.com)                  #
# This software is licenced under GNU GPL version 2.                          #
###############################################################################

###############################################################################
# Menu principal de opcoes...                                                #
###############################################################################
function menu () {
	#menu de opcoes de testes
	dialog --shadow --backtitle "SNMPGrab" --nocancel\
		--menu "Escolha o teste que deseja realizar:" 0 0 0 \
		1 "Capturar dados da AU" \
		2 "Capturar dados da SU" \
		3 "Capturar dados do AP WLAN_IC" \
		4 "Capturar dados de um dispositivo com Mib-2" \
		5 "Realizar um teste com o Iperf" \
		6 "AutoIPERF" \
		7 "Manipular base de dados" \
		8 "Configuracoes"  \
		9 "Documentacao" \
		0 "Sair" 2> $tempfile

	resposta=$(cat $tempfile)
	#echo $resposta
	rm -rf fifo/resposta

	case $resposta in
	1)
		linktest_au
	;;
	2)
		linktest_su
	;;
	3)
		linktest_wlan_ic
	;;
	4)
		linktest_mib2
	;;
	5)
		linktest_iperf
	;;
	6)
		autoiperf
	;;
	7)
		database
	;;
	8)
		configurar
	;;
	9)
		ajuda
	;;
	0) #funcao SAIR
		sair
	;;
	esac
}  #end function menu

function sair {
	rm -rf $tempfile
	clear
	exit 0;
} #end function sair

###############################################################################
# funcoes de linktest para a AU                                               #
###############################################################################
function linktest_au {
	dialog --shadow --backtitle "SNMPGrab" --nocancel\
		--menu "Escolha tipo de teste para realizar na AU:" 0 0 0 \
		1 "Mostrar SNR ao vivo" \
		2 "Logar dados" \
		0 "Retornar" 2> $tempfile

	resposta=$(cat $tempfile)
	rm -rf fifo/resposta

	case $resposta in	
	1) 
		linktest_au_quick	
	;;
	2)
		linktest_au_log
	;;
	3)
		return 0
	;;
	esac
} #end function linktest_au

function linktest_au_quick {
	opcoes=$(snmpwalk -v 1 -Oq -c public 10.1.1.221 .1.3.6.1.4.1.12394.1.1.11.5.1.2.1.45 | cut -b 49-)
	dialog --shadow --backtitle "SNMPGrab" --nocancel\
		--menu "Escolha a SU a monitorar:" 0 0 0 \
		$opcoes \
		0 "Retornar" 2>$tempfile

	resposta=$(cat $tempfile)
	rm -rf fifo/resposta

	case $resposta in	
	0) 
		return 0
	;;
	*)
	nomedasu=$(snmpget -Oqv -v 1 -c public 10.1.1.221 1.3.6.1.4.1.12394.1.1.11.5.1.2.1.45.$resposta)

	{
		while :
		do
			snmpget -Oqv -v 1 -c public 10.1.1.221 1.3.6.1.4.1.12394.1.1.11.5.1.2.1.5.$resposta; 
			usleep 450000;
		done 
		} | \
		dialog --shadow --backtitle "SNMPGrab" --nocancel\
			--gauge "SNR da SU $resposta:"$nomedasu 0 40
	;;
	esac
}

function linktest_au_log {
	#a funcao de log está num arquivo separado!
	./linktest_alvarion_AU.sh
}

###############################################################################
# funcoes de linktest para a SU                                               #
###############################################################################
function linktest_su {
	dialog --shadow --backtitle "SNMPGrab" --nocancel\
		--menu "Escolha tipo de teste para realizar na SU:" 0 0 0 \
		1 "Mostrar SNR ao vivo" \
		2 "Logar dados" \
		0 "Retornar" 2> $tempfile

	resposta=$(cat $tempfile)
	rm -rf fifo/resposta

	case $resposta in	
	1) 
		linktest_su_quick
	;;
	2)
		linktest_su_log
	;;
	3)
		return 0
	;;
	esac
} #end function linktest_su

function linktest_su_quick {
	dialog --shadow --backtitle "SNMPGrab" --nocancel\
		--inputbox "Digite o IP da SU a monitorar, ou 0 para sair:" 0 0 2>$tempfile

	endip=$(cat $tempfile)
	rm -rf fifo/resposta

	case $endip in	
	0) 
		return 0
	;;
	*)
		nomedasu=$(snmpget -Oqv -v 1 -c public $endip .1.3.6.1.2.1.1.5.0)
		{
			while :
			do
				snmpget -Oqv -v 1 -c public $endip .1.3.6.1.4.1.12394.1.1.11.1.0; 
				usleep 450000;
			done 
		} | dialog --shadow --backtitle "SNMPGrab" --nocancel\
			--gauge "SNR da SU $endip:"$nomedasu 0 40
	;;
	esac
}

function linktest_su_log {
	dialog --shadow --backtitle "SNMPGrab" --nocancel\
		--inputbox "Digite o IP da SU a monitorar, ou 0 para sair:" 0 0 2>$tempfile

	endip=$(cat $tempfile)
	rm -rf fifo/resposta

	case $endip in	
	0) 
		return 0
	;;
	*)
		./linktest_alvarion_SU.sh $endip
	;;
	esac
}

###############################################################################
# funcoes de linktest para o AP-600                                           #
###############################################################################
function linktest_wlan_ic {
#	dialog --msgbox "Linktest WLAN IC ainda nao implementado neste menu!" 0 0
	./linktest_wlan_ic.sh
} #end function linktest_wlan_ic

###############################################################################
# funcoes de linktest para mib2                                               #
###############################################################################
function linktest_mib2 {
	dialog --shadow --backtitle "SNMPGrab" --nocancel\
		--inputbox "Digite o IP do equipamento (com MIB-2) a monitorar, ou 0 para sair:" 0 0 2>$tempfile

	endip=$(cat $tempfile)
	rm -rf fifo/resposta

	case $endip in	
	0) 
		return 0
	;;
	*)
		./linktest_mib2.sh $endip
	;;
	esac
} #end function linktest_mib2

###############################################################################
# funcoes de linktest para o iperf                                            #
###############################################################################
function linktest_iperf {
	dialog --shadow --backtitle "SNMPGrab" --nocancel\
		--menu "Escolha a funcao deste computador:" 0 0 0 \
		1 "Cliente" \
		2 "Servidor" \
		0 "Retornar" 2> $tempfile

	resposta=$(cat $tempfile)
	rm -rf fifo/resposta

	case $resposta in	
	1) 
		iperf_cliente
	;;
	2)	
		./linktest_iperf.sh
	;;
	3)
		return 0
	;;
	esac
} #end function linktest_iperf

function iperf_cliente {
	dialog --shadow --backtitle "SNMPGrab" --nocancel\
		--inputbox "Digite o IP do servidor IPERF" 0 0 2>$tempfile
	endip=$(cat $tempfile)

	dialog --shadow --backtitle "SNMPGrab" --nocancel\
		--inputbox "Digite a banda desejada (como seria passada ao Iperf):" 0 0 2>$tempfile
	bw=$(cat $tempfile)

	dialog --shadow --backtitle "SNMPGrab" --nocancel\
		--inputbox "Digite o numero de segundos desejado:" 0 0 2>$tempfile
	duracao=$(cat $tempfile)

	bin/iperf2 -c $endip -u -i 1 -t $duracao -b $bw
} #end function iperf_cliente

###############################################################################
# funcoes de automatizacao de testes do IPERF                                 #
###############################################################################
function autoiperf {
	while :
	do
		dialog --shadow --backtitle "SNMPGrab" --nocancel\
			--menu "Qual a funcao deste micro no teste?" 0 0 0 \
			1 "Cliente AutoIPERF" \
			2 "Servidor AutoIPERF" \
			0 "Retornar" 2> $tempfile
	
		resposta=$(cat $tempfile)
		rm -rf $tempfile

		case $resposta in
		1)
			dialog --shadow --backtitle "SNMPGrab" --nocancel\
				--inputbox "Digite o IP do servidor AutoIPERF, ou 0 para sair:" 0 0 2>$tempfile
			dip=$(cat $tempfile)

			dialog --shadow --backtitle "SNMPGrab" --nocancel\
				--inputbox "Digite a banda desejada (como passado ao parametro -B):" 0 0 2>$tempfile
			bw=$(cat $tempfile)

			dialog --shadow --backtitle "SNMPGrab" --nocancel\
				--inputbox "Digite o tempo de teste desejado (em segundos):" 0 0 2>$tempfile
			tme=$(cat $tempfile)

			dialog --shadow --backtitle "SNMPGrab" --nocancel\
				--inputbox "Digite o IP DESTE COMPUTADOR:" 0 0 2>$tempfile
			lip=$(cat $tempfile)
			
			rm -rf fifo/resposta

			case $dip in
			0)
				return 0
			;;
			*)
			./autoiperf_client.sh $dip $bw $tme $lip
			;;
			esac
		;;

		2)
			./autoiperf_server.sh
		;;

		0)
			return 0
		;;
		esac
	done

}

###############################################################################
# Funcao de controle da base de dados                                         #
###############################################################################
function database {

	while :
	do
		dialog --shadow --backtitle "SNMPGrab" --nocancel\
			--menu "Que operacao deseja efetuar na base de dados? $sair" 0 0 0 \
			1 "Exportar dados de testes" \
			2 "Backup completo da base de dados" \
			3 "Restaurar backup da base de dados" \
			4 "Inicializar base de dados" \
			0 "Retornar" 2> $tempfile
	
		resposta=$(cat $tempfile)
		rm -rf $tempfile

		case $resposta in
		1)
			dialog --msgbox "A Funcao \"Exportar dados de testes\" ainda nao foi implementada" 0 0
		;;

		2)
			dialog --shadow --backtitle "SNMPGrab" --nocancel\
				--inputbox "Digite o nome do arquivo a conter o dump da base de dados (relativo ao diretorio local)." 0 0 "mysqldump.sql" 2> $tempfile
			nomedoarquivo=$(cat $tempfile)
			rm -rf $tempfile
			
			dialog --shadow --backtitle "SNMPGrab" --nocancel\
				--infobox "Aguarde, executando dump da base de dados..." 0 0
			mysqldump -A > $nomedoarquivo 
		;;

		3)
			dialog --msgbox "A Funcao \"Restaurar backup da base de dados\" ainda nao foi implementada" 0 0
		;;

		4)
			database_reinit
		;;
		0)
			return 0
		;;
		esac
	done

} #end function database

function database_reinit {
	#verifica se devemos ou nao continuar com a reinicializacao
	dialog --shadow --backtitle "SNMPGrab" --nocancel\
		--inputbox "ATENCAO!! ESTA OPERACAO APAGARA TODOS OS DADOS DA BASE DE DADOS, CASO HOUVER ALGUM!!!! Para continuar, digite \"SIM!\", caso contrario a operacao sera cancelada." 11 60 2>$tempfile
		
	resposta=$(cat $tempfile)
	rm -rf tempfile

	#analiza a resposta
	case $resposta in
	SIM!)
		dialog --shadow --backtitle "SNMPGrab"\
			--infobox "Um password sera solicitado duas vezes. Utilize a senha de ROOT do servidor MYSQL (Diferente da senha de root do sistema!)" 5 50
		mysqladmin -h $(cat conf/database) -u root -p create testes_alvarion 
		mysql -h $(cat conf/database) -u root -p testes_alvarion < doc/database.sql
	;;
	*)
		dialog --shadow --backtitle "SNMPGrab" --nocancel\
			--msgbox "A reinicializacao do banco de dados foi CANCELADA" 0 0
		return 0		
	;;
	esac
}

###############################################################################
# Funcao de configuracao geral                                                #
###############################################################################
function configurar {
	dialog --shadow --backtitle "SNMPGrab" --nocancel\
		--menu "O que deseja configurar?" 0 0 0 \
		1 "Endereco IP da base de dados" \
		0 "Retornar" 2> $tempfile

		resposta=$(cat $tempfile)
		rm -rf $tempfile

		case $resposta in
		1)
			configura_ip_db
		;;
		0)
			return 0
		;;
		esac

} #end function configurar

function configura_ip_db {
			while :
			do
				dialog --shadow --backtitle "SNMPGrab" --nocancel \
				--inputbox "Digite o End IP da base de dados" 9 30 $(cat conf/database) 2> $tempfile

				ipaddr=$(cat $tempfile)
				rm -rf $tempfile

				#VERIFICA SE �UM IP VALIDO!!
				#se sim, escreve e volta
				echo $ipaddr > conf/database
				return 0
				#se nao, cancela!
			done
}

###############################################################################
# Funcao de ajuda                                                             #
###############################################################################
function ajuda {
	dialog 	--shadow --backtitle "SNMPGrab" --nocancel \
		--textbox doc/manual 0 0
} #end function ajuda

###############################################################################
# comeco do programa em si                                                    #
###############################################################################

#cria um arquivo temporario para guardar os resultados
tempfile=`tempfile 2>/dev/null` || tempfile=fifo/test$$
trap "rm -f $tempfile" 0 1 2 5 15

#Mostra uma mensagem de boas vindas
dialog 	--shadow --backtitle "SNMPGrab" \
	--msgbox "Benvindo ao SNMPGrab" 7 30

#executa o loop principal do menu
while :
do
	menu
done

#fim (o resto �cuidado por funcoes)
